import jwt from 'jsonwebtoken'
import conf from '../../config'
import userModel from '../../models/user'
module.exports = {
    async login (ctx, next) {
      console.log('----------------登录接口 user/login-----------------------');
      let {username, password} = ctx.request.body;
      try {
        let data = await ctx.findOne(userModel, {username: username});
        if (!data) {
          return ctx.resResultError('用户名不存在！');
        }
        console.log('qqq')
        if (password !== data.pwd) {
          return ctx.resResultError('密码错误,请重新输入！');
        }
        await ctx.update(userModel, {_id: data._id}, {$set:{loginTime: new Date()}}) //更新登陆时间

        let payload = {
          _id: data._id,
          roles: data.roles
        }
        let token = jwt.sign(payload, conf.auth.admin_secret, {expiresIn: '24h'})  //token签名 有效期为24小时
        // ctx.cookies.set(conf.auth.tokenKey, token, {
        //   httpOnly: false,  // 是否只用于http请求中获取
        // });
        ctx.resResult({token}, '登陆成功');
      } catch (e) {
        if (e === '暂无数据') {
          console.log('用户名不存在')
          return ctx.resResultError('用户名不存在');
        }
        ctx.throw(e);
        ctx.resResultError(e);
      }
    },

    async info (ctx, next) {
      console.log('----------------获取用户信息接口 user/getUserInfo-----------------------');
      // let token = ctx.request.header.authorization.split(' ')[1];
      // 上下两个都可以
      let token = ctx.request.query.token;
      try {
        let tokenInfo = jwt.verify(token, conf.auth.admin_secret);
        let data = await userModel.findById(tokenInfo._id, {pwd: 0});
        console.log(data)
        ctx.resResult(data)
      } catch (e) {
        ctx.resResultError(e);
      }
    },

    async list (ctx, next) {
      console.log('----------------获取用户信息列表接口 user/getUserList-----------------------');
      let { keyword = '', pageindex = 1, pagesize = 10} = ctx.request.body;
      // let token = ctx.request.header[conf.auth.tokenKey];
      try {
        // let tokenInfo = jwt.verify(token, conf.auth.admin_secret);
        let reg = new RegExp(keyword, 'i')
        let data = await ctx.findPage(userModel, {
          $or: [
            {name: { $regex: reg}},
            {username: { $regex: reg}}
          ], username: {$ne: 'admin'}
        }, {pwd: 0}, {limit: pagesize*1, skip: (pageindex-1)*pagesize});

        ctx.resResult(data)
      }catch (e){
        ctx.resResultError(e);
      }
    },

    async add (ctx, next) {
      console.log('----------------添加管理员 user/add-----------------------');
      let paramsData = ctx.request.body;
      // let token = ctx.request.header[conf.auth.tokenKey];
      try {
        // let tokenInfo = jwt.verify(token, conf.auth.admin_secret);
        let data = await ctx.findOne(userModel, {name: paramsData.name})
        if (data) {
          ctx.resResultError('数据已经存在, 请重新添加!')
        } else {
          let data = await ctx.add(userModel, paramsData);
          ctx.resResult({}, '添加成功！')
        }
      } catch(e) {
        // if ('TokenExpiredError' === e.name) {
        //   ctx.resResultError('鉴权失败, 请重新登录!');
        //   // ctx.throw(401, 'token expired,请及时本地保存数据！');
        // }
        ctx.resResultError(e);
        // ctx.throw(401, 'invalid token');
      }
  },
  // 超级管理员 修改 其他管理员 账户名、密码、头像
  async update (ctx, next) {
    console.log('----------------超级管理员 修改 其他管理员 账户名、密码、头像 user/update-----------------------');
    let paramsData = ctx.request.body;
    console.log(paramsData)
    const can = await ctx.isAdmin(paramsData._id)
    if (can) {
      try {
        // let tokenInfo = jwt.verify(token, conf.auth.admin_secret);
        let data = await ctx.findOne(userModel, {username: paramsData.username})
        if (data && (paramsData._id !== data._id.toString())) {
          return ctx.resResultError('此用户名已存在!')
        }
        if (data && (paramsData.old_pwd !== data.pwd)) {
          return ctx.resResultError('密码不匹配!')
        }
        delete paramsData.old_pwd
        await ctx.update(userModel, {_id: paramsData._id}, paramsData)
        ctx.resResult({}, '更新成功！')
      }catch(e) {
        ctx.resResultError(e);
      }
    } else {
      return ctx.resResultError({statusCode: 403, message: '非管理员账户禁止操作'})
    }
  },
  // 管理员 修改 自己 账户名、密码、头像
  async updateMySelf (ctx, next) {
    console.log('----------------管理员 修改 自己 账户名、密码、头像 user/updateMySelf-----------------------');
    const { id } = ctx.params
    let { type } = ctx.request.body
    if (!id) {
      return ctx.resResultError('修改失败，缺少必传参数！');
    }
    try {
      switch (type) {
        // 修改头像
        case 'avatar':
          let { avatar } = ctx.request.body
          await userModel.findByIdAndUpdate(id, { avatar })
          return ctx.resResult({}, '头像修改成功！')
          break;
        // 修改密码
        case 'pwd':
          let { old_pwd, new_pwd } = ctx.request.body

          if (!old_pwd || !new_pwd) {
            return ctx.resResultError('修改失败，缺少必传参数！');
          }

          const user = await userModel.findById(id)

          if (user.pwd !== old_pwd) {
            return ctx.resResultError('原密码错误');
          } else {
            await userModel.findByIdAndUpdate(id, { pwd: new_pwd })
            return ctx.resResult({}, '修改成功，请重新登录')
          }
          break;
          // 重置密码
          case 'reset':
            let { pwd } = ctx.request.body
            await userModel.findByIdAndUpdate(id, { pwd })
            return ctx.resResult({}, '重置成功')
            break;
        // 修改账户
        case 'username':
          let { username } = ctx.request.body
          let isExisted = await userModel.findOne({ username }).where('_id').ne(id)
          if (!!isExisted) {
            return ctx.resResultError('用户已存在');
          } else {
            await userModel.findByIdAndUpdate(id, { username })
            return ctx.resResult({}, '修改成功，请重新登录')
          }
          break

        default:
          return ctx.resResultError('未作修改');
      }
    } catch (e) {
      ctx.resResultError(e);
    }
  },

  async del (ctx, next) {
    console.log('----------------删除管理员 user/del-----------------------');
    let id = ctx.request.query.id
    // let token = ctx.request.header[conf.auth.tokenKey];
    try {
      // let tokenInfo = jwt.verify(token, conf.auth.admin_secret);
      ctx.remove(userModel, {_id: id})
      ctx.resResult({}, '删除成功！')
    } catch(e) {
      ctx.resResultError(e);
    }
  },

  async logout (ctx, next) {
    console.log('----------------登出 user/del-----------------------');
    try {
      ctx.resResult({}, '已退出登录！');
    }catch(e){
      ctx.resResultError(e)
    }
  }
}
